<?php
/**
* 描述：导入配置文件。
*/
require('./config.php');

/**
* 描述：注册tryPHP核心构件。
*/
spl_autoload_register(function($name){
    $parts=array(
        #核心构件。
        'Route'=>'./route.php',
        'Controller'=>'/controller.php',
        'Database'=>'./database.php',
        'Template'=>'./template.php',
        'Error'=>'./error.php',
        #try类库。
        'EPDO'=>'./library/try/epdo.php',                          //数据库操作类。
        'Uploader'=>'./library/try/uploader.php',                  //文件上传类。
        'Cookie'=>'./library/try/cookie.php',                      //cookie操作封装类。
        'Session'=>'./library/try/session.php',                    //session操作封类。
        'Email'=>'./library/try/email.php',                        //email发送类，socket方式实现。
        'Functions'=>'./library/try/functions.php',                //函数功能大全类。
        #其它类库。
        'Smarty'=>'./library/smarty/smarty.class.php',             //smarty模板引擎类。
        'Captcha'=>'./library/captcha/captcha.php',                //验证码生成类。
        'XheditorUploader'=>'./library/apps/xheditorUploader.php', //xheditor编辑器上传类。
    );
    if(isset($parts[$name])){
        include_once($parts[$name]);
    }
});

/**
* 描述：并测检配置项。
*/
if(!defined('TRYPHP_DEBUG')){
    Error::Cast('TryPHP配置错误，配置项“调试开关”未设置，配置项字面量：TRYPHP_DEBUG。');
}
if(!defined('TRYPHP_ROUTE_PROTOCOL')){
    Error::Cast('TryPHP配置错误，配置项“路由协议”未设置，配置项字面量：TRYPHP_ROUTE_PROTOCOL。');
}
if(!defined('TRYPHP_DEFAULT_APPLICATION')){
    Error::Cast('TryPHP配置错误，配置项“默认应用”未设置，配置项字面量：TRYPHP_DEFAULT_APPLICATION。');
}
if(!defined('TRYPHP_DEFAULT_CONTROLLER')){
    Error::Cast('TryPHP配置错误，配置项“默认控制器”未设置，配置项字面量：TRYPHP_DEFAULT_CONTROLLER。');
}
if(!defined('TRYPHP_APPLICATIONINDENTURE_FOLDERPREFIXION')){
    Error::Cast('TryPHP配置错误，配置项“应用文件夹前缀”未设置，配置项字面量：TRYPHP_APPLICATIONINDENTURE_FOLDERPREFIXION。');
}
if(!defined('TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_APPLICATION')){
    Error::Cast('TryPHP配置错误，配置项“COMMON协议参数名-应用”未设置，配置项字面量：TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_APPLICATION。');
}
if(!defined('TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_CONTROLLER')){
    Error::Cast('TryPHP配置错误，配置项“COMMON协议参数名-控制器”未设置，配置项字面量：TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_CONTROLLER。');
}
if(!defined('TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_METHOD')){
    Error::Cast('TryPHP配置错误，配置项“COMMON协议参数名-方法”未设置，配置项字面量：TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_METHOD。');
}
if(!defined('TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_MODE')){
    Error::Cast('TryPHP配置错误，配置项“COMMON协议参数名-模式”未设置，配置项字面量：TRYPHP_ROUTE_PROTOCOLOPTIONS_COMMON_PARAMETERNAME_MODE。');
}

/**
* 描述：初始化基要全局标量。
*/
$Root=$_SERVER["DOCUMENT_ROOT"];
$BuildRoot=str_replace('\\','/',dirname(dirname(__FILE__)));
$BuildPath=NULL;
$BuildPathOffset=NULL;
if($Root!==$BuildRoot){
    $BuildPathOffset=str_replace($Root,'',$BuildRoot);
    $BuildPath='/'.substr($BuildPathOffset,1,strlen($BuildPathOffset));
}
$BuildURIPath='http://'.$_SERVER["HTTP_HOST"].$BuildPath;
define('ROOT',$Root);                         //文档根目录。
define('BUILD_ROOT',$BuildRoot);              //架设根目录。
define('BUILD_PATH_OFFSET',$BuildPathOffset); //偏移路径。
define('BUILD_PATH',$BuildPath);              //相对的架设根目录。
define('BUILD_URI_PATH',$BuildURIPath);       //架设级URI基路径。

/**
* 描述：初始化应用基要全局标量。
*/
$ApplicationName=Route::GetArguments('application');
$ApplicationRoot=$BuildRoot.'/'.TRYPHP_APPLICATIONINDENTURE_FOLDERPREFIXION.$ApplicationName;
$ApplicationPath=$BuildPath.'/'.TRYPHP_APPLICATIONINDENTURE_FOLDERPREFIXION.$ApplicationName;
$ApplicationURIPath='http://'.$_SERVER["HTTP_HOST"].$ApplicationPath;
define('APP_ROOT',$ApplicationRoot);        //应用文档根目录。
define('APP_PATH',$ApplicationPath);        //相对的应用文档根目录。
define('APP_URI_PATH',$ApplicationURIPath); //应用用URI基路径。

/**
* 描述：定位控制器程式。
*/
#检测应用目录是否真的存在。不存在就终止程序，并在调试错误开关打开的情况下输出错误信息供于调试。
if(file_exists(APP_ROOT)===FALSE){
    if('on'===strtolower(TRYPHP_DEBUG)){
        Error::Cast(sprintf('找不到应用文件夹，路径是：%s。',APP_ROOT));
    }
    Route::Http404(TRYPHP_ERRORDOCUMENT_404);
    exit();
}
#在应用目录存在的情况下，检测具体的控制器文件是否存在，不存在则根据调试错误的开关状态输出信息。
$FileName=str_replace('_','/',Route::GetArguments(Route::INDEX_NAME_CONTROLLER));
$FilePath=APP_ROOT.'/_controller/'.$FileName.'.php';
if(file_exists($FilePath)===FALSE){
    if('on'===strtolower(TRYPHP_DEBUG)){
        Error::Cast(sprintf('找不到控制器文件，路径是：%s。',$FilePath));
    }
    Route::Http404(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_404);
    exit();
}

/**
* 描述：导入控制器所在应用配置。
*/
#如果应用存在配置文件，根据应用配置文件执行应用配置。
$ApplicationConfigFilePath=APP_ROOT.'/_config/application.php';
if(file_exists($ApplicationConfigFilePath)){
    $ApplicationConfig=include($ApplicationConfigFilePath);
    if(array_key_exists('Initialization',$ApplicationConfig)&&'object'==gettype($ApplicationConfig['Initialization'])){
        $ApplicationConfig['Initialization']();
    }
}
#如果应用存在类库注册配置文件。就根据配置文件，注册相应类库。
$AutoloadConfigFilePath=APP_ROOT.'/_config/autoload.php';
if(file_exists($AutoloadConfigFilePath)){
    spl_autoload_register(function($name) use($AutoloadConfigFilePath){
        if($name){
            $classCollection=include($AutoloadConfigFilePath);
            if(array_key_exists($name,$classCollection)){
                include_once($classCollection[$name]);
            }
        }
    });
}

/**
* 描述：创行控制器。
*/
#引入控制器文件，如果是”过程控制器“，导入即是执行。
include($FilePath);
#如果控制器类型是”类控制器“就解析类名称并创行控制器。
if(Controller::MODE_CLASS===Route::GetArguments(Route::INDEX_NAME_MODE)){
    #构建类名称。
    $ControllerClassName=NULL;
    foreach(explode('_',Route::GetArguments(Route::INDEX_NAME_CONTROLLER)) as $value){
        $ControllerClassName=($ControllerClassName.'_'.ucfirst($value));
    }
    $ControllerClassName='Controller'.rtrim($ControllerClassName,'_');
    #检测类是否存在。
    if(class_exists($ControllerClassName)){
        new $ControllerClassName(Route::GetArguments(Route::INDEX_NAME_METHOD));
    }
    else{
        if('on'===strtolower(TRYPHP_DEBUG)){
            Error::Cast(sprintf('找不到控制器类定义，类名是%s。',$ControllerClassName));
        }
        Route::Http404(APP_ROOT.'/'.TRYPHP_APPLICATIONINDENTURE_ERRORDOCUMENT_404);
    }
}
?>